package cn.com.headfree.util;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import sun.net.ftp.FtpClient;

import java.io.*;
import java.util.UUID;

public class FtpUtils {

    private static final Logger logger = Logger.getLogger(FtpUtils.class);

    /**
     * 上传文件到ftp
     *
     * @param file
     * @return
     */
    public static boolean uploadToFtp(File file, String hostname, String username, String password, String ftpDir) throws IOException {
        FTPClient ftpClient = new FTPClient();
        try {
            //连接ftp服务器 参数填服务器的ip
            logger.info("连接ftp");
//            ftpClient.connect("10.138.109.252");
            ftpClient.connect(hostname);
            //进行登录 参数分别为账号 密码
            logger.info("登录ftp");
            ftpClient.login(username, password);
//            ftpClient.login("ifree", "ifree1234");
            //改变工作目录（按自己需要是否改变）
            //只能选择local_root下已存在的目录
            logger.info("选定文件夹");
//            ftpClient.changeWorkingDirectory("img");
            ftpClient.changeWorkingDirectory(ftpDir);
            //设置文件类型为二进制文件
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            //开启被动模式（按自己如何配置的ftp服务器来决定是否开启）,打开传输通道
            ftpClient.enterLocalPassiveMode();
            //上传文件 参数：上传后的文件名，输入流
            logger.info("ftp上传");
            ftpClient.storeFile(file.getName(), new FileInputStream(file));

            logger.info("上传完成");
            System.out.println(file.getName());
        } catch (IOException e) {
            logger.info("ftp上传失败");
            e.printStackTrace();
            return false;
        } finally {

            try {
                if (ftpClient != null) {
                    logger.info("关闭ftp连接");
                    ftpClient.logout();
                    ftpClient.disconnect();
                    logger.info("关闭ftp连接成功");
                }
                logger.info("操作成功");
            } catch (Exception e) {
                logger.error("ftp连接关闭失败");
            }


        }
        return true;
    }

    /**
     * Description: 从FTP服务器下载文件
     *
     * @param hostname  FTP服务器hostname
     *                  FTP登录密码
     * @param ftpDir    FTP服务器上的相对路径
     * @param fileName  要下载的文件名
     * @param localPath 下载后保存到本地的路径
     * @return
     * @Version1.0
     */
    public static boolean downFile(String hostname, String username, String password, String ftpDir, String localPath, String fileName) {
        FTPClient ftpClient = new FTPClient();
        boolean result = false;
        try {
            int reply;

            logger.info("下载:连接ftp");
            ftpClient.setControlEncoding("gb2312");
            ftpClient.connect(hostname);
//            ftpClient.connect("10.138.109.252");
            // 如果采用默认端口，可以使用ftp.connect(hostname)的方式直接连接FTP服务器

            ftpClient.login(username, password);// 登录
//            ftpClient.login("ifree","ifree1234");// 登录
            logger.info("下载:登录ftp");
            // 设置文件传输类型为二进制

            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            logger.info("下载:设置类型二进制");
            // 获取ftp登录应答代码
            logger.info("下载:ftp登录应答代码");
            reply = ftpClient.getReplyCode();
            // 验证是否登陆成功
            if (!FTPReply.isPositiveCompletion(reply)) {
                logger.info("下载:ftp取消连接");
                ftpClient.disconnect();
                System.err.println("FTP server refused connection.");
                return result;
            }
            // 转移到FTP服务器目录至指定的目录下
            logger.info("下载:跳转到指定的工作路径:" + ftpDir);
            ftpClient.changeWorkingDirectory(new String(ftpDir.getBytes("gb2312"), "iso-8859-1"));
            // 获取文件列表
            //打开传输通道
            ftpClient.enterLocalPassiveMode();
            logger.info("下载:获取文件列表");
            FTPFile[] fs = ftpClient.listFiles();
            ftpClient.listFiles();

            logger.info("下载:获取文件列表成功,装备下载");
            for (FTPFile ff : fs) {
                logger.info("1======================");
                if (ff.getName().equals(fileName)) {
                    logger.info("2=====================");
                    logger.info("下载:在指定路径创建文件:" + localPath + "," + ff.getName());
                    File localFile = new File(localPath + "/" + ff.getName());
                    logger.info("3=====================");
                    OutputStream is = new FileOutputStream(localFile);
                    logger.info("4=====================");
                    ftpClient.retrieveFile(ff.getName(), is);
                    logger.info("5=====================");
                    logger.info("关闭outputstream");
                    is.close();
                }
            }
            logger.info("下载:关闭ftp客户端");
            ftpClient.logout();
            ftpClient.disconnect();
            logger.info("下载:关闭ftp客户端连接成功");
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * ftp删除文件
     *
     * @param filename
     * @return
     */
    public static boolean deleteFile(String hostname, String username, String password, String ftpDir, String filename) {
        boolean flag = false;//是否删除成功
        FTPClient ftpClient = new FTPClient();
        try {
            //连接ftp服务器 参数填服务器的ip
            logger.info("连接ftp");
//            ftpClient.connect("10.138.109.252");
            ftpClient.connect(hostname);
            //进行登录 参数分别为账号 密码
            logger.info("登录ftp");
            ftpClient.login(username, password);
//            ftpClient.login("ifree", "ifree1234");
            //改变工作目录（按自己需要是否改变）
            //只能选择local_root下已存在的目录
            logger.info("选定文件夹");
//            ftpClient.changeWorkingDirectory("img");
            ftpClient.changeWorkingDirectory(ftpDir);
            //设置文件类型为二进制文件
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            //开启被动模式（按自己如何配置的ftp服务器来决定是否开启）,打开传输通道
            ftpClient.enterLocalPassiveMode();
            logger.info("ftp准备删除文件");
            ftpClient.deleteFile(filename);
            logger.info("ftp删除成功");

            logger.info("删除:关闭ftp客户端");
            ftpClient.logout();
            ftpClient.disconnect();
            logger.info("删除:关闭ftp客户端连接成功");

            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("删除失败");
        }
        return flag;
    }


}
